package com.siashan.toolkit.core.wrapper;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;

/**
 * 通用请求返回封装Bean
 *
 * @author siashan
 * @version V1.0.1
 */

@NoArgsConstructor
@Setter
@Getter
@ToString
public  class AjaxResult<T> implements Serializable {
    /**
     * 接口返回状态码
     */
    private int code;
    /**
     * 返回信息
     */
    private String msg;
    /**
     * subCode
     */
    private int subCode;
    /**
     * subMsg
     */
    private String subMsg;


    /**
     * 签名
     */
    private String sign;
    /**
     * 返回报文体
     */
    private T data;


    /**
     * 接口请求成功
     *
     * @return 请求结果
     */
    public static AjaxResult success() {
        return baseCreate(ResultCode.SUCCESS);
    }

    /**
     * 接口请求成功
     *
     * @param msg 返回的自定义消息
     * @return 请求结果
     */
    public static AjaxResult success(String msg) {
        return baseCreate(ResultCode.SUCCESS, msg);
    }

    /**
     * 接口请求成功
     *
     * @param data 返回的数据体
     * @return 请求结果
     */
    public static <T> AjaxResult<T> successData(T data) {
        AjaxResult<T> result = success();
        result.setData(data);
        return result;
    }


    /**
     * 接口请求成功
     *
     * @param data 返回的数据体
     * @return 请求结果
     */
    public static <T> AjaxResult<T> success(T data) {
        AjaxResult<T> result = success();
        result.setData(data);
        return result;
    }

    /**
     * 接口请求成功
     *
     * @param msg  自定义返回消息
     * @param data 返回的数据体
     * @return 请求结果
     */
    public static <T> AjaxResult<T> success(String msg, T data) {
        AjaxResult<T> result = success(msg);
        result.setData(data);
        return result;
    }

    /**
     * 用户未认证
     *
     * @return 请求结果
     */

    public static AjaxResult unauthorized() {
        return baseCreate(ResultCode.UNAUTHORIZED);
    }


    /**
     * 参数列表错误（缺少，格式不匹配）
     *
     * @return 请求结果
     */

    public static AjaxResult badRequest() {
        return baseCreate(ResultCode.BAD_REQUEST);
    }

    /**
     * 参数列表错误（缺少，格式不匹配）
     *
     * @param msg 自定义错误消息
     * @return 请求结果
     */

    public static AjaxResult badRequest(String msg) {
        return baseCreate(ResultCode.BAD_REQUEST, msg);
    }

    /**
     * 用户未认证
     *
     * @param msg 自定义返回消息
     * @return 请求结果
     */

    public static AjaxResult unauthorized(String msg) {
        return baseCreate(ResultCode.UNAUTHORIZED, msg);
    }


    /**
     * 操作失败
     *
     * @return 请求结果
     */
    public static AjaxResult error() {
        return baseCreate(ResultCode.ERROR);
    }

    /**
     * 操作失败
     *
     * @param msg 自定义返回消息
     * @return 请求结果
     */
    public static AjaxResult error(String msg) {
        return baseCreate(ResultCode.ERROR, msg);
    }

    /**
     * 操作失败
     *
     * @param resultCode 自定义错误码
     * @param msg        自定义返回消息
     * @return 请求结果
     */
    public static AjaxResult error(ResultCode resultCode, String msg) {
        return baseCreate(resultCode, msg);
    }


    private static AjaxResult baseCreate(ResultCode resultCode, String msg) {
        AjaxResult commonResult = baseCreate(resultCode);
        commonResult.setMsg(msg);
        return commonResult;
    }

    private static <T> AjaxResult<T> baseCreate(ResultCode resultCode) {
        AjaxResult<T> result = new AjaxResult<T>();
        result.setCode(resultCode.getCode());
        result.setMsg(resultCode.getDesp());
        return result;
    }


    /**
     * 判断是否成功
     *
     * @return true/成功   false /失败
     */
    public boolean isSuccess() {
        return ResultCode.SUCCESS.getCode() == this.code;
    }

}
